const emptydataTag = 'emptydata';

class emptydata {
  get [Symbol.toStringTag]() {
    return emptydataTag;
  }

  /**
   * 默认 data 为 信息顺序 数组
   * @param {string} [sortdata = "data"]
   */
  constructor(sortdata = 'data') {
    delete this.data;
    this[sortdata] = [];
    this.#sortdata = sortdata;
  }

  /**
   * 信息顺序 数组 名
   *  @type {string}
   */
  #sortdata;

  /**
   * 用于 记录 信息 顺序 key 值 的 数组
   * @type {[]}
   */
  data = [];

  /**
   * 获取 给定 key 值 的 索引值
   * @param {string} keyVal key 值
   * @returns
   */
  get_key_ind(keyVal) {
    return this.data.indexOf(keyVal);
  }

  /**
   * 获取 给定 ind 值 的 内容值
   * @param {number} ind 索引值
   * @returns
   */
  get_ind_key(ind) {
    return this.data[ind];
  }

  /**
   * 返回 给定值 data 中 的数据
   * @param {string} key
   * @returns {undefined | any}
   */
  get_key_val(key) {
    if (this.data.includes(key)) {
      return this[key];
    }
    return undefined;
  }

  /**
   * ObjectOnlyPushSet ==
   * @param {string} key
   * @param {*} val
   * @returns {boolean}
   */
  set_key_val(key, val) {
    if (this.get_key_ind(key) > -1) {
      return false;
    }

    this[this.#sortdata].push(key);

    this[key] = val;

    return true;
  }

  /**
   * removeObjectOnlyPushSet ==
   * @param {string} key
   */
  remove_key(key) {
    let key_ind = this.get_key_ind(key);
    if (key_ind == -1) {
      return false;
    }

    // 删除 信息顺序 数组 中的 信息记录
    this[this.#sortdata].splice(key_ind, 1);

    // 删除 key 值 记录
    delete this[key];
    return true;
  }

  /**
   * 对当前 data 数据 中的 信息 依次 进行 调用 cb
   * @param {function} cb 回调函数 (key,this[key])
   */
  forEach(cb) {
    for (const key of this.data) {
      cb(key, this[key]);
    }
  }
}

export { emptydata };
